package com.qf.rbac2202.annotation;

import com.qf.rbac2202.sys.entity.SysLog;
import com.qf.rbac2202.sys.entity.SysRole;
import com.qf.rbac2202.sys.entity.SysUser;
import com.qf.rbac2202.sys.service.ISysLogService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.awt.*;
import java.sql.Timestamp;
import java.util.Date;
import java.util.List;


@Aspect
@Component
public class MyService {
	@Autowired
	ISysLogService iSysLogService;

	@Pointcut("execution(* com.qf.rbac2202.sys.controller.*.*delete*(..))")
	public void point1(){}

	@Pointcut("execution(* com.qf.rbac2202.sys.controller.*.*save*(..))")
	public void point2(){}

	@Pointcut("execution(* com.qf.rbac2202.sys.controller.*.*update*(..))")
	public void point3(){}



	@After("point1()")//也可以写成@After("execution(* com.AOP.EmailDao.re*(..))")，表示该结构下的以re开头的方法执行完后都会执行以下方法。
	public void receive1(JoinPoint joinPoint)
	{
		insertIntoDataBase(joinPoint);

	}

	@After("point3()")//也可以写成@After("execution(* com.AOP.EmailDao.re*(..))")，表示该结构下的以re开头的方法执行完后都会执行以下方法。
	public void receive2(JoinPoint joinPoint)
	{
		insertIntoDataBase(joinPoint);
	}

	@After("point2()")//也可以写成@After("execution(* com.AOP.EmailDao.re*(..))")，表示该结构下的以re开头的方法执行完后都会执行以下方法。
	public void receive3(JoinPoint joinPoint)
	{
		insertIntoDataBase(joinPoint);
	}

	//写一个通配的方法专门用于向数据库里添加数据
	public void insertIntoDataBase(JoinPoint joinPoint){
		//获取当前登录用户对象的id和name
		Subject subject=SecurityUtils.getSubject( );
		SysUser principal=(SysUser) subject.getPrincipal( );
		Long userId=principal.getUserId( );
		String username=principal.getUsername( );

		Date date=new Date( );
		Timestamp timestamp=new Timestamp( date.getTime( ) );

		//获取方法名
		MethodSignature signature=(MethodSignature) joinPoint.getSignature( );
		String methodName=signature.getMethod( ).getName( );

		//获取方法中的参数
		Object[] filedNames=joinPoint.getArgs( );

		Object filedName= filedNames[0];

		String mes="";

		if(filedName instanceof SysRole){

				mes+=filedName.toString();


		}else if(filedName instanceof List){

			for(String s: (List< String >) filedName) {
				mes +=s;
			}

		}else {
			mes=filedName+"";
		}


		//调用相关的service来实现数据库的写入工作
		iSysLogService.save( new SysLog(null,userId,username,timestamp,methodName,mes) );
		//将所有的参数转化为hasmap的格式写入数据库


	}

}
